package cn.iocoder.yudao.module.design.service.house;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.design.controller.admin.house.vo.*;
import cn.iocoder.yudao.module.design.dal.dataobject.house.HouseDO;
import cn.iocoder.yudao.module.design.dal.dataobject.pic.PicDO;
import cn.iocoder.yudao.module.design.service.house.bo.NodeItemDataBO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 装修的房子信息 Service 接口
 *
 * @author 芋道源码
 */
public interface HouseService {


    Long createBusinessHouse(@Valid HouseOneReqVO createReqVO);


    /**
     * 更新房子信息
     *
     * @param updateReqVO 更新信息
     */
    void updateBusinessHouse(@Valid HouseOneReqVO updateReqVO);
    /**
     * 创建装修的房子信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createHouse(@Valid HouseCreateReqVO createReqVO);

    void addPicData(@Valid HouseUpdatePicDataReqVO createReqVO);


    /**
     * 更新装修的房子信息
     *
     * @param updateReqVO 更新信息
     */
    void updateHouse(@Valid HouseUpdateReqVO updateReqVO);

    /**
     * 删除装修的房子信息
     *
     * @param id 编号
     */
    void deleteHouse(Long id);

    HouseOneResVO getHouseOneById(Long id);
    /**
     * 获得装修的房子信息
     *
     * @param id 编号
     * @return 装修的房子信息
     */
    HouseDO getHouse(Long id);

    /**
     * 校验项目数据是否存在
     * @param[1] id
     */
    HouseDO validateHouseExists(Long id);

    /**
     * 获得装修的房子信息
     *
     * @param id 编号
     * @return 装修的房子信息
     */
    HouseRespVO getHouseById(Long id);

    /**
     * 获得装修的房子信息
     *
     * @param id 编号
     * @return 装修的房子信息
     */
    HouseSimInfoVO getSimHouseInfo(Long id);



    /**
     * 获得装修的房子信息列表
     *
     * @param ids 编号
     * @return 装修的房子信息列表
     */
    List<HouseDO> getHouseList(Collection<Long> ids);

    /**
     * 获得装修的房子信息分页
     *
     * @param pageReqVO 分页查询
     * @return 装修的房子信息分页
     */
    PageResult<HouseDO> getHousePage(HousePageReqVO pageReqVO);

    /**
     * 获得装修的房子信息列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 装修的房子信息列表
     */
    List<HouseDO> getHouseList(HouseExportReqVO exportReqVO);

    List<HouseRespVO> getHouseList(HouseBaseVO baseVO);
    List<HouseDO> getHouseByStatus(Integer status);

    /** 新增好友请求*/
    Long createUserRel(String nickName ,String mobile,String roleId);

    /**
     * 新增好友请求并新增登录用户
     * @param vo
     */
    Long  createUserRel(@Valid HouseUserRelVO vo);


    /**
     *  新增项目风格类型
     * @param styleCd 项目风格
     * @return 项目风格
     */
    Long  createStyleCd(String styleCd);

    List<HouseNodeDateVO> getHouseNodeAndUrl(Long id);

    /**
     * 关闭项目
     * @param id  houseId主键
     */
    void closeHouse(Long id);
    /**
     * 新增供应商负责人并新增登录用户
     * @param vo
     */
    Long createPrincipalUserRel(HousePrincipalUserRelVO vo) ;


    void saveNextIdsData(Long flowId,Long houseId,Long preId,
                         Long designerId,String flowDtlCd, String nextIds,Collection<Long> flowMdIds);


    void updateUnitTotalDays(Long houseId, Integer days);

    void saveNextIdsData(Long flowId, Long houseId, Long preId,
                         Long designerId, String flowDtlCd, String nextIds );

    /**
     * 查询当前登录人在项目内所属角色
     * @author Annie
     * @time 2023/8/11 15:14
     * @param[1] houseId
     * @return List<String>
     */
    List<String> getHouseRoles(Long houseId);

    /**
     * 创建采购流程
     * @param house
     * @param userId
     * @param orgName
     */
    void createPurchaseFLow(HouseDO house,Long userId,String orgName);

    void saveHouseUserRelTask(Long houseId, String projectName, Long userId, Long roleId, Integer statusCd);


    void saveNodeItemData(NodeItemDataBO context);
    /**
     * 启动项目
     * @throws
     */
    void startHouseStatus(Long houseId,String payOrderId);

    /**
     * 发起流程待办
     * @throws
     */
    void saveFlowTask(HouseDO house,Integer flowCd);

    /**
     * 保存用户和流程的关系
     * @param houseId
     * @param flowId
     * @param userId
     * @param roleId
     */

    void saveHouseUserFlowRel(Long houseId ,Long flowId ,Long userId ,Long roleId);

    /**
     * 查询项目内多个sourceType 资源文件
     *
     * @param[1] houseId
     * @param[2] sourceTypes
     * @return List<PicDO>
     */
    List<PicDO> getPicDataList(Long houseId, List<String> sourceTypes);

    /**
     * 保存家庭用户关系
     *
     * @param vo 家庭用户关系请求对象
     */
    void saveFamilyUserRel(HouseUserRelFamilyReqVO vo);
}
